package com.lhy.utilsdemo.demo;

import java.util.concurrent.*;

/**
 * @author Liu Hangyu
 * @date 2021/12/14 13:59
 */
public class ThreadDemo {
    public static void main(String[] args) {

        //1.CPU密集型 最大线程数 Runtime.getRuntime().availableProcessors()
        //2.IO密集型 判断IO操作线程有多少个   IO线程 双倍最好   留一半处理IO以外的任务

        System.out.println("CPU核数---》"+Runtime.getRuntime().availableProcessors());
        ExecutorService executorService = new ThreadPoolExecutor(
                //核心线程数
                2,
                //最大线程数
                Runtime.getRuntime().availableProcessors(),
                //存活时间
                3,
                //存活时间单位
                TimeUnit.SECONDS,
                //存放需要执行的任务
                new ArrayBlockingQueue<>(2),
                //线程工厂
                Executors.defaultThreadFactory(),
                //拒绝策略
                //AbortPolicy(默认):丢弃任务并抛出RejectedExecutionException异常。
                //DiscardPolicy：丢弃任务，但是不抛出异常。
                //DiscardOldestPolicy：丢弃队列最前面的任务，然后重新提交被拒绝的任务
                //CallerRunsPolicy：由调用线程（提交任务的线程，也就是主线程）处理该任
                new ThreadPoolExecutor.CallerRunsPolicy());


        try {
            //最大承载 ：Queue+max
            for (int i = 0; i < 17; i++) {
                final int temp=i;
                executorService.execute(() -> {
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() +"----"+ temp+"---ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            executorService.shutdown();
        }

    }


}
